From: Dimitrios Eftaxiopoulos Date: Sat, 24 Mar 2012 16:07:46 +0000 (+0200) Subject: Imported Upstream version 2~rc2+svn380 X-Git-Tag: archive/raspbian/2.5-2+rpi1^2~26^2~31 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=0146b52e53cff3f046e1d8b012027a5cde726229;p=mathgl.git Imported Upstream version 2~rc2+svn380 --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 423ccd8..2921bc7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -121,7 +121,8 @@ else(enable-all OR enable-jpeg) set(MGL_HAVE_JPEG 0) endif(enable-all OR enable-jpeg) -if((enable-all OR enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) +#if((enable-all OR enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) +if((enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) set(MGL_HAVE_U3D 1) find_library(U3D_LIB IDTF) if(NOT U3D_LIB) @@ -133,11 +134,14 @@ if((enable-all OR enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) endif(NOT U3D_INCLUDE_DIR) message(STATUS "Found U3D libraries at: ${U3D_LIB}") message(STATUS "Found U3D headers: ${U3D_INCLUDE_DIR}") +#else((enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) else((enable-all OR enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) set(MGL_HAVE_U3D 0) -endif((enable-all OR enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) +#endif((enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) +endif((enable-u3d OR enable-pdf) AND (NOT enable-lgpl) ) -if((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +#if((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +if((enable-pdf) AND (NOT enable-lgpl) ) set(MGL_HAVE_PDF 1) find_library(HPDF_LIB hpdf) if(NOT HPDF_LIB) @@ -149,9 +153,11 @@ if((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) endif(NOT HPDF_INCLUDE_DIR) message(STATUS "Found libHaru library at: ${HPDF_LIB}") message(STATUS "Found libHaru headers: ${HPDF_INCLUDE_DIR}") -else((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +#else((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +else((enable-pdf) AND (NOT enable-lgpl) ) set(MGL_HAVE_PDF 0) -endif((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +#endif((enable-all OR enable-pdf) AND (NOT enable-lgpl) ) +endif((enable-pdf) AND (NOT enable-lgpl) ) if(enable-all OR enable-gif) set(MGL_HAVE_GIF 1) diff --git a/include/mgl/canvas_cf.h b/include/mgl/canvas_cf.h index 56a2636..f432fa9 100644 --- a/include/mgl/canvas_cf.h +++ b/include/mgl/canvas_cf.h @@ -261,10 +261,10 @@ void mgl_zoom_(uintptr_t *graph, float *x1, float *y1, float *x2, float *y2); void mgl_rotate_vector_(uintptr_t *graph, float *Tet,float *x,float *y,float *z); void mgl_perspective_(uintptr_t *graph, float val); /*****************************************************************************/ -int mgl_fortran_func(HMGL gr, void *); -HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par); -HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par); +HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); +HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)); int mgl_fltk_run(); +int mgl_fltk_thr(); int mgl_qt_run(); /*****************************************************************************/ uintptr_t mgl_create_graph_qt_(const char *title, int); diff --git a/include/mgl/canvas_wnd.h b/include/mgl/canvas_wnd.h new file mode 100644 index 0000000..4c2d01e --- /dev/null +++ b/include/mgl/canvas_wnd.h @@ -0,0 +1,75 @@ +/*************************************************************************** + * window.h is part of Math Graphic Library + * Copyright (C) 2007 Alexey Balakin * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +//----------------------------------------------------------------------------- +#ifndef _MGL_CANVAS_WND_H_ +#define _MGL_CANVAS_WND_H_ +/*****************************************************************************/ +#include "mgl/window.h" +//----------------------------------------------------------------------------- +/// Base class for windows containing MathGL graphics +class mglCanvasWnd : public mglCanvas +{ +public: + mglCanvasWnd(); + virtual ~mglCanvasWnd(); + + void SetSize(int w,int h); + void EndFrame(); + const unsigned char *GetBits(); + inline int GetNumFig() { return NumFig; } + inline int GetCurFig() { return CurFig; } + void SetCurFig(int c); + void ClearFrames(); + inline mglPoint GetMousePos() { return LastMousePos;} + inline void SetMousePos(mglPoint p) { LastMousePos=p; } + inline void Setup(bool clf_upd=true, bool showpos=false) + { set(showpos,MGL_SHOW_POS); set(clf_upd,MGL_CLF_ON_UPD); } + + virtual void ToggleAlpha()=0; ///< Switch on/off transparency (do not overwrite user settings) + virtual void ToggleLight()=0; ///< Switch on/off lighting (do not overwrite user settings) + virtual void ToggleZoom()=0; ///< Switch on/off zooming by mouse + virtual void ToggleRotate()=0; ///< Switch on/off rotation by mouse + virtual void ToggleNo()=0; ///< Switch off all zooming and rotation + virtual void Update()=0; ///< Update picture by calling user drawing function + virtual void Adjust()=0; ///< Adjust size of bitmap to window size + virtual void GotoFrame(int d)=0;///< Show arbitrary frame (use relative step) + virtual void NextFrame() {GotoFrame(+1);} ///< Show next frame (if one) + virtual void PrevFrame() {GotoFrame(-1);} ///< Show previous frame (if one) + virtual void Animation()=0; ///< Run slideshow (animation) of frames + void ReLoad(); ///< Reload user data and update picture + /// Create a window for plotting based on callback function (can be NULL). + virtual void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), + const char *title, void *par=NULL, + void (*reload)(void *p)=NULL, bool maximize=false)=0; + void SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par=NULL, void (*reload)(void *p)=NULL); + +private: + mglPoint LastMousePos; ///< Last mouse position + int CurFig; ///< Current figure in the list. + + unsigned char *GG; ///< images for all frames (may be too LARGE !!!) + int NumFig; ///< Number of figures in the list. If 0 then no list and mglCanvas::DrawFunc will called for each drawing. + void (*LoadFunc)(void *par); + void *FuncPar; ///< Parameters for drawing function mglCanvas::DrawFunc. + /// Drawing function for window procedure. It should return the number of frames. + int (*DrawFunc)(mglBase *gr, void *par); +}; +//----------------------------------------------------------------------------- +#endif diff --git a/include/mgl/data.h b/include/mgl/data.h index 866dc08..e377cac 100644 --- a/include/mgl/data.h +++ b/include/mgl/data.h @@ -21,281 +21,8 @@ #define _MGL_DATA_H_ /*****************************************************************************/ #include "mgl/base.h" -/*****************************************************************************/ -#if MGL_HAVE_GSL -#include -#include -#else -struct gsl_vector; -struct gsl_matrix; -#endif -/*****************************************************************************/ +#include "mgl/data_cf.h" #ifdef __cplusplus -extern "C" { -#endif -/*****************************************************************************/ -void mgl_srnd(long seed); -double mgl_rnd(); -double mgl_ipow(double x,int n); -/*****************************************************************************/ -HMDT mgl_create_data(); -HMDT mgl_create_data_size(long nx, long ny, long nz); -HMDT mgl_create_data_file(const char *fname); -void mgl_delete_data(HMDT dat); -const char *mgl_data_info(HCDT dat); -/*****************************************************************************/ -uintptr_t mgl_create_data_(); -uintptr_t mgl_create_data_size_(int *nx, int *ny, int *nz); -uintptr_t mgl_create_data_file_(const char *fname, int len); -void mgl_delete_data_(uintptr_t *dat); -/*****************************************************************************/ -/* Data creation functions */ -/*****************************************************************************/ -void mgl_data_rearrange(HMDT dat, long mx,long my,long mz); -void mgl_data_link(HMDT dat, mreal *A,long mx,long my,long mz); -void mgl_data_set_float(HMDT dat, const float *A,long mx,long my,long mz); -void mgl_data_set_double(HMDT dat, const double *A,long mx,long my,long mz); -void mgl_data_set_float2(HMDT d, const float **A,long N1,long N2); -void mgl_data_set_double2(HMDT d, const double **A,long N1,long N2); -void mgl_data_set_float3(HMDT d, const float ***A,long N1,long N2,long N3); -void mgl_data_set_double3(HMDT d, const double ***A,long N1,long N2,long N3); -void mgl_data_set(HMDT dat, HCDT a); -void mgl_data_set_vector(HMDT dat, gsl_vector *v); -void mgl_data_set_matrix(HMDT dat, gsl_matrix *m); -void mgl_data_set_value(HMDT dat, float v, long i, long j, long k); -float mgl_data_get_value(HCDT dat, long i, long j, long k); -void mgl_data_set_values(HMDT dat, const char *val, long nx, long ny, long nz); - -int mgl_data_read_hdf(HMDT d,const char *fname,const char *data); -void mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); -int mgl_datas_hdf(const char *fname, char *buf, long size); -int mgl_data_read(HMDT dat, const char *fname); -int mgl_data_read_mat(HMDT dat, const char *fname, long dim); -int mgl_data_read_dim(HMDT dat, const char *fname,long mx,long my,long mz); -int mgl_data_read_range(HMDT d, const char *templ, double from, double to, double step, int as_slice); -int mgl_data_read_all(HMDT dat, const char *templ, int as_slice); -void mgl_data_save(HCDT dat, const char *fname,long ns); -void mgl_data_export(HCDT dat, const char *fname, const char *scheme,float v1,float v2,long ns); -void mgl_data_import(HMDT dat, const char *fname, const char *scheme,float v1,float v2); - -void mgl_data_create(HMDT dat, long nx,long ny,long nz); -void mgl_data_transpose(HMDT dat, const char *dim); -void mgl_data_norm(HMDT dat, float v1,float v2,long sym,long dim); -void mgl_data_norm_slice(HMDT dat, float v1,float v2,char dir,long keep_en,long sym); -HMDT mgl_data_subdata(HCDT dat, long xx,long yy,long zz); -HMDT mgl_data_subdata_ext(HCDT dat, HCDT xx, HCDT yy, HCDT zz); -HMDT mgl_data_column(HCDT dat, const char *eq); -void mgl_data_set_id(HMDT d, const char *id); -void mgl_data_fill(HMDT dat, float x1,float x2,char dir); -void mgl_data_fill_eq(HMGL gr, HMDT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); -void mgl_data_put_val(HMDT dat, mreal val, long i, long j, long k); -void mgl_data_put_dat(HMDT dat, HCDT val, long i, long j, long k); -void mgl_data_modify(HMDT dat, const char *eq,long dim); -void mgl_data_modify_vw(HMDT dat, const char *eq,HCDT vdat,HCDT wdat); -void mgl_data_squeeze(HMDT dat, long rx,long ry,long rz,long smooth); -float mgl_data_max(HCDT dat); -float mgl_data_min(HCDT dat); -float *mgl_data_value(HMDT dat, long i,long j,long k); -mreal *mgl_data_data(HMDT dat); - -float mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); -float mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); -long mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); -int mgl_data_find_any(HCDT dat, const char *cond); -float mgl_data_max_int(HCDT dat, long *i, long *j, long *k); -float mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); -float mgl_data_min_int(HCDT dat, long *i, long *j, long *k); -float mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); -float mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); - -HMDT mgl_data_combine(HCDT dat1, HCDT dat2); -void mgl_data_extend(HMDT dat, long n1, long n2); -void mgl_data_insert(HMDT dat, char dir, long at, long num); -void mgl_data_delete(HMDT dat, char dir, long at, long num); -/*****************************************************************************/ -/* Data manipulation functions */ -/*****************************************************************************/ -void mgl_data_smooth(HMDT d, const char *dirs, float delta); -HMDT mgl_data_sum(HCDT dat, const char *dir); -HMDT mgl_data_max_dir(HCDT dat, const char *dir); -HMDT mgl_data_min_dir(HCDT dat, const char *dir); -void mgl_data_cumsum(HMDT dat, const char *dir); -void mgl_data_integral(HMDT dat, const char *dir); -void mgl_data_diff(HMDT dat, const char *dir); -void mgl_data_diff_par(HMDT dat, HCDT v1, HCDT v2, HCDT v3); -void mgl_data_diff2(HMDT dat, const char *dir); -void mgl_data_swap(HMDT dat, const char *dir); -void mgl_data_roll(HMDT dat, char dir, long num); -void mgl_data_mirror(HMDT dat, const char *dir); -void mgl_data_sort(HMDT dat, long idx, long idy); - -void mgl_data_hankel(HMDT dat, const char *dir); -void mgl_data_sinfft(HMDT dat, const char *dir); -void mgl_data_cosfft(HMDT dat, const char *dir); -void mgl_data_fill_sample(HMDT dat, const char *how); - -float mgl_data_spline(HCDT dat, float x,float y,float z); -float mgl_data_linear(HCDT dat, float x,float y,float z); -HMDT mgl_data_trace(HCDT d); -HMDT mgl_data_resize(HCDT dat, long mx,long my,long mz); -HMDT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,float x1,float x2,float y1,float y2,float z1,float z2); -HMDT mgl_data_hist(HCDT dat, long n, float v1, float v2, long nsub); -HMDT mgl_data_hist_w(HCDT dat, HCDT weight, long n, float v1, float v2, long nsub); -HMDT mgl_data_momentum(HCDT dat, char dir, const char *how); -HMDT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); -void mgl_data_envelop(HMDT dat, char dir); -void mgl_data_sew(HMDT dat, const char *dirs, float da); -void mgl_data_crop(HMDT dat, long n1, long n2, char dir); -/*****************************************************************************/ -/* Data operations */ -/*****************************************************************************/ -void mgl_data_mul_dat(HMDT dat, HCDT d); -void mgl_data_div_dat(HMDT dat, HCDT d); -void mgl_data_add_dat(HMDT dat, HCDT d); -void mgl_data_sub_dat(HMDT dat, HCDT d); -void mgl_data_mul_num(HMDT dat, float d); -void mgl_data_div_num(HMDT dat, float d); -void mgl_data_add_num(HMDT dat, float d); -void mgl_data_sub_num(HMDT dat, float d); -/*****************************************************************************/ -HMDT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, float dz, float k0,const char *opt); -HMDT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, float r, float k0, HMDT xx, HMDT yy); -HMDT mgl_ray_trace(const char *ham, float x0, float y0, float z0, float px, float py, float pz, float dt, float tmax); -HMDT mgl_jacobian_2d(HCDT x, HCDT y); -HMDT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z); -HMDT mgl_transform_a(HCDT am, HCDT ph, const char *tr); -HMDT mgl_transform(HCDT re, HCDT im, const char *tr); -void mgl_data_fourier(HMDT re, HMDT im, const char *dir); -HMDT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir); - -HMDT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z, float er); -HMDT mgl_triangulation_2d(HCDT x, HCDT y, float er); -/*****************************************************************************/ -/* Data creation functions */ -/*****************************************************************************/ -void mgl_data_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); -void mgl_data_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); -void mgl_data_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); -void mgl_data_set_float1_(uintptr_t *d, const float *A,int *N1); -void mgl_data_set_double1_(uintptr_t *d, const double *A,int *N1); -void mgl_data_set_float2_(uintptr_t *d, const float *A,int *N1,int *N2); -void mgl_data_set_double2_(uintptr_t *d, const double *A,int *N1,int *N2); -void mgl_data_set_float3_(uintptr_t *d, const float *A,int *N1,int *N2,int *N3); -void mgl_data_set_double3_(uintptr_t *d, const double *A,int *N1,int *N2,int *N3); -void mgl_data_set_(uintptr_t *dat, uintptr_t *a); - -void mgl_data_set_value_(uintptr_t *d, float *v, int *i, int *j, int *k); -void mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); -float mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); -int mgl_data_read_(uintptr_t *d, const char *fname,int l); -int mgl_data_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); -int mgl_data_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); -void mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); -void mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,float *v1,float *v2,int *ns,int,int); -void mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,float *v1,float *v2,int,int); -void mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); -void mgl_data_transpose_(uintptr_t *dat, const char *dim,int); -void mgl_data_norm_(uintptr_t *dat, float *v1,float *v2,int *sym,int *dim); -void mgl_data_norm_slice_(uintptr_t *dat, float *v1,float *v2,char *dir,int *keep_en,int *sym,int l); -uintptr_t mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); -uintptr_t mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); -uintptr_t mgl_data_column_(uintptr_t *dat, const char *eq,int l); -void mgl_data_set_id_(uintptr_t *dat, const char *id,int l); -void mgl_data_fill_(uintptr_t *dat, float *x1,float *x2,const char *dir,int); -void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); -void mgl_data_put_val_(uintptr_t *dat, float *val, int *i, int *j, int *k); -void mgl_data_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); -void mgl_data_modify_(uintptr_t *dat, const char *eq,int *dim,int); -void mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); -void mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); -float mgl_data_max_(uintptr_t *dat); -float mgl_data_min_(uintptr_t *dat); - -float mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); -float mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); -int mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int); -int mgl_data_find_any_(uintptr_t *dat, const char *cond, int); -float mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k); -float mgl_data_max_real_(uintptr_t *dat, float *x, float *y, float *z); -float mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k); -float mgl_data_min_real_(uintptr_t *dat, float *x, float *y, float *z); -float mgl_data_momentum_val_(uintptr_t *dat, char *dir, float *m, float *w, float *s, float *k,int); - -uintptr_t mgl_data_combine_(uintptr_t *dat1, uintptr_t *dat2); -void mgl_data_extend_(uintptr_t *dat, int *n1, int *n2); -void mgl_data_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); -void mgl_data_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); -/*****************************************************************************/ -/* Data manipulation functions */ -/*****************************************************************************/ -void mgl_data_smooth_(uintptr_t *dat, const char *dirs, float *delta,int); -uintptr_t mgl_data_sum_(uintptr_t *dat, const char *dir,int); -uintptr_t mgl_data_max_dir_(uintptr_t *dat, const char *dir,int); -uintptr_t mgl_data_min_dir_(uintptr_t *dat, const char *dir,int); -void mgl_data_cumsum_(uintptr_t *dat, const char *dir,int); -void mgl_data_integral_(uintptr_t *dat, const char *dir,int); -void mgl_data_diff_(uintptr_t *dat, const char *dir,int); -void mgl_data_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3); -void mgl_data_diff2_(uintptr_t *dat, const char *dir,int); -void mgl_data_swap_(uintptr_t *dat, const char *dir,int); -void mgl_data_roll_(uintptr_t *dat, const char *dir, int *num, int); -void mgl_data_mirror_(uintptr_t *dat, const char *dir,int); -void mgl_data_sort_(uintptr_t *dat, int *idx, int *idy); - -void mgl_data_hankel_(uintptr_t *dat, const char *dir,int); -void mgl_data_sinfft_(uintptr_t *dat, const char *dir,int); -void mgl_data_cosfft_(uintptr_t *dat, const char *dir,int); -void mgl_data_fill_sample_(uintptr_t *dat, const char *how,int); - -float mgl_data_spline_(uintptr_t *dat, float *x,float *y,float *z); -float mgl_data_linear_(uintptr_t *dat, float *x,float *y,float *z); -uintptr_t mgl_data_trace_(uintptr_t *d); -uintptr_t mgl_data_resize_(uintptr_t *dat, int *mx,int *my,int *mz); -uintptr_t mgl_data_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,float *x1,float *x2,float *y1,float *y2,float *z1,float *z2); -uintptr_t mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); -uintptr_t mgl_data_hist_(uintptr_t *dat, int *n, float *v1, float *v2, int *nsub); -uintptr_t mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, float *v1, float *v2, int *nsub); -uintptr_t mgl_data_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); -void mgl_data_envelop_(uintptr_t *dat, const char *dir, int); -void mgl_data_sew_(uintptr_t *dat, const char *dirs, float *da, int); -void mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); -/*****************************************************************************/ -/* Data operations */ -/*****************************************************************************/ -void mgl_data_mul_dat_(uintptr_t *dat, uintptr_t *d); -void mgl_data_div_dat_(uintptr_t *dat, uintptr_t *d); -void mgl_data_add_dat_(uintptr_t *dat, uintptr_t *d); -void mgl_data_sub_dat_(uintptr_t *dat, uintptr_t *d); -void mgl_data_mul_num_(uintptr_t *dat, float *d); -void mgl_data_div_num_(uintptr_t *dat, float *d); -void mgl_data_add_num_(uintptr_t *dat, float *d); -void mgl_data_sub_num_(uintptr_t *dat, float *d); -/*****************************************************************************/ -/* Nonlinear fitting */ -/*****************************************************************************/ -uintptr_t mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, float *dz, float *k0,const char *opt,int,int); -uintptr_t mgl_qo2d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, float *r, float *k0, uintptr_t* xx, uintptr_t* yy, int); -uintptr_t mgl_ray_trace_(const char *ham, float *x0, float *y0, float *z0, float *px, float *py, float *pz, float *dt, float *tmax,int); -uintptr_t mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y); -uintptr_t mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z); - -uintptr_t mgl_transform_a_(uintptr_t *am, uintptr_t *ph, const char *tr, int); -uintptr_t mgl_transform_(uintptr_t *re, uintptr_t *im, const char *tr, int); -void mgl_data_fourier_(uintptr_t *re, uintptr_t *im, const char *dir, int l); -uintptr_t mgl_data_stfa_(uintptr_t *re, uintptr_t *im, int *dn, char *dir, int); - -uintptr_t mgl_triangulation_3d_(uintptr_t *x, uintptr_t *y, uintptr_t *z, float *er); -uintptr_t mgl_triangulation_2d_(uintptr_t *x, uintptr_t *y, float *er); -/*****************************************************************************/ -int mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); -void mgl_data_link_(uintptr_t *d, float *A, int *nx,int *ny,int *nz); -void mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); -int mgl_data_read_range_(uintptr_t *d, const char *fname, double *from, double *to, double *step, int *as_slice,int l); -int mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); - -/*****************************************************************************/ -#ifdef __cplusplus -} //----------------------------------------------------------------------------- #include //----------------------------------------------------------------------------- @@ -425,7 +152,7 @@ public: inline void Fill(mglBase *gr, const char *eq, const mglData &vdat, const mglData &wdat,const char *opt="") { mgl_data_fill_eq(gr,this,eq,&vdat,&wdat,opt); } /// Eqidistantly fill the data to range [x1,x2] in direction \a dir - inline void Fill(mreal x1,mreal x2=NAN,char dir='x') + inline void Fill(mreal x1,mreal x2=NaN,char dir='x') { return mgl_data_fill(this,x1,x2,dir); } /// Put value to data element(s) inline void Put(mreal val, long i=-1, long j=-1, long k=-1) @@ -545,7 +272,7 @@ public: inline void Envelop(char dir='x') { mgl_data_envelop(this,dir); } /// Remove phase jump - inline void Sew(const char *dirs="xyz", mreal da=2*M_PI) + inline void Sew(const char *dirs="xyz", mreal da=2*Pi) { mgl_data_sew(this,dirs,da); } /// Smooth the data on specified direction or directions inline void Smooth(const char *dirs="xyz",mreal delta=0) @@ -641,9 +368,11 @@ public: inline void operator+=(mreal d) { mgl_data_add_num(this,d); } /// Substract the number inline void operator-=(mreal d) { mgl_data_sub_num(this,d); } +#ifndef SWIG /// Direct access to the data cell inline mreal &operator[](long i) { return a[i]; } // NOTE see 13.10 for operator(), operator[] -- m.b. I should add it ??? +#endif protected: /// Get the value in given cell of the data without border checking inline mreal v(long i,long j=0,long k=0) const @@ -666,6 +395,7 @@ protected: return k>0? (k * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU Library General Public License as * + * published by the Free Software Foundation; either version 3 of the * + * License, or (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU Library General Public * + * License along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#ifndef _MGL_DATA_CF_H_ +#define _MGL_DATA_CF_H_ +/*****************************************************************************/ +#include "mgl/base.h" +/*****************************************************************************/ +#if MGL_HAVE_GSL +#include +#include +#else +struct gsl_vector; +struct gsl_matrix; +#endif +/*****************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif +/*****************************************************************************/ +void mgl_srnd(long seed); +double mgl_rnd(); +double mgl_ipow(double x,int n); +/*****************************************************************************/ +HMDT mgl_create_data(); +HMDT mgl_create_data_size(long nx, long ny, long nz); +HMDT mgl_create_data_file(const char *fname); +void mgl_delete_data(HMDT dat); +const char *mgl_data_info(HCDT dat); +/*****************************************************************************/ +uintptr_t mgl_create_data_(); +uintptr_t mgl_create_data_size_(int *nx, int *ny, int *nz); +uintptr_t mgl_create_data_file_(const char *fname, int len); +void mgl_delete_data_(uintptr_t *dat); +/*****************************************************************************/ +/* Data creation functions */ +/*****************************************************************************/ +void mgl_data_rearrange(HMDT dat, long mx,long my,long mz); +void mgl_data_link(HMDT dat, mreal *A,long mx,long my,long mz); +void mgl_data_set_float(HMDT dat, const float *A,long mx,long my,long mz); +void mgl_data_set_double(HMDT dat, const double *A,long mx,long my,long mz); +void mgl_data_set_float2(HMDT d, const float **A,long N1,long N2); +void mgl_data_set_double2(HMDT d, const double **A,long N1,long N2); +void mgl_data_set_float3(HMDT d, const float ***A,long N1,long N2,long N3); +void mgl_data_set_double3(HMDT d, const double ***A,long N1,long N2,long N3); +void mgl_data_set(HMDT dat, HCDT a); +void mgl_data_set_vector(HMDT dat, gsl_vector *v); +void mgl_data_set_matrix(HMDT dat, gsl_matrix *m); +void mgl_data_set_value(HMDT dat, float v, long i, long j, long k); +float mgl_data_get_value(HCDT dat, long i, long j, long k); +void mgl_data_set_values(HMDT dat, const char *val, long nx, long ny, long nz); + +int mgl_data_read_hdf(HMDT d,const char *fname,const char *data); +void mgl_data_save_hdf(HCDT d,const char *fname,const char *data,int rewrite); +int mgl_datas_hdf(const char *fname, char *buf, long size); +int mgl_data_read(HMDT dat, const char *fname); +int mgl_data_read_mat(HMDT dat, const char *fname, long dim); +int mgl_data_read_dim(HMDT dat, const char *fname,long mx,long my,long mz); +int mgl_data_read_range(HMDT d, const char *templ, double from, double to, double step, int as_slice); +int mgl_data_read_all(HMDT dat, const char *templ, int as_slice); +void mgl_data_save(HCDT dat, const char *fname,long ns); +void mgl_data_export(HCDT dat, const char *fname, const char *scheme,float v1,float v2,long ns); +void mgl_data_import(HMDT dat, const char *fname, const char *scheme,float v1,float v2); + +void mgl_data_create(HMDT dat, long nx,long ny,long nz); +void mgl_data_transpose(HMDT dat, const char *dim); +void mgl_data_norm(HMDT dat, float v1,float v2,long sym,long dim); +void mgl_data_norm_slice(HMDT dat, float v1,float v2,char dir,long keep_en,long sym); +HMDT mgl_data_subdata(HCDT dat, long xx,long yy,long zz); +HMDT mgl_data_subdata_ext(HCDT dat, HCDT xx, HCDT yy, HCDT zz); +HMDT mgl_data_column(HCDT dat, const char *eq); +void mgl_data_set_id(HMDT d, const char *id); +void mgl_data_fill(HMDT dat, float x1,float x2,char dir); +void mgl_data_fill_eq(HMGL gr, HMDT dat, const char *eq, HCDT vdat, HCDT wdat,const char *opt); +void mgl_data_put_val(HMDT dat, mreal val, long i, long j, long k); +void mgl_data_put_dat(HMDT dat, HCDT val, long i, long j, long k); +void mgl_data_modify(HMDT dat, const char *eq,long dim); +void mgl_data_modify_vw(HMDT dat, const char *eq,HCDT vdat,HCDT wdat); +void mgl_data_squeeze(HMDT dat, long rx,long ry,long rz,long smooth); +float mgl_data_max(HCDT dat); +float mgl_data_min(HCDT dat); +mreal *mgl_data_value(HMDT dat, long i,long j,long k); +mreal *mgl_data_data(HMDT dat); + +float mgl_data_first(HCDT dat, const char *cond, long *i, long *j, long *k); +float mgl_data_last(HCDT dat, const char *cond, long *i, long *j, long *k); +long mgl_data_find(HCDT dat, const char *cond, char dir, long i, long j, long k); +int mgl_data_find_any(HCDT dat, const char *cond); +float mgl_data_max_int(HCDT dat, long *i, long *j, long *k); +float mgl_data_max_real(HCDT dat, mreal *x, mreal *y, mreal *z); +float mgl_data_min_int(HCDT dat, long *i, long *j, long *k); +float mgl_data_min_real(HCDT dat, mreal *x, mreal *y, mreal *z); +float mgl_data_momentum_val(HCDT d, char dir, mreal *m, mreal *w, mreal *s, mreal *k); + +HMDT mgl_data_combine(HCDT dat1, HCDT dat2); +void mgl_data_extend(HMDT dat, long n1, long n2); +void mgl_data_insert(HMDT dat, char dir, long at, long num); +void mgl_data_delete(HMDT dat, char dir, long at, long num); +/*****************************************************************************/ +/* Data manipulation functions */ +/*****************************************************************************/ +void mgl_data_smooth(HMDT d, const char *dirs, float delta); +HMDT mgl_data_sum(HCDT dat, const char *dir); +HMDT mgl_data_max_dir(HCDT dat, const char *dir); +HMDT mgl_data_min_dir(HCDT dat, const char *dir); +void mgl_data_cumsum(HMDT dat, const char *dir); +void mgl_data_integral(HMDT dat, const char *dir); +void mgl_data_diff(HMDT dat, const char *dir); +void mgl_data_diff_par(HMDT dat, HCDT v1, HCDT v2, HCDT v3); +void mgl_data_diff2(HMDT dat, const char *dir); +void mgl_data_swap(HMDT dat, const char *dir); +void mgl_data_roll(HMDT dat, char dir, long num); +void mgl_data_mirror(HMDT dat, const char *dir); +void mgl_data_sort(HMDT dat, long idx, long idy); + +void mgl_data_hankel(HMDT dat, const char *dir); +void mgl_data_sinfft(HMDT dat, const char *dir); +void mgl_data_cosfft(HMDT dat, const char *dir); +void mgl_data_fill_sample(HMDT dat, const char *how); + +float mgl_data_spline(HCDT dat, float x,float y,float z); +float mgl_data_linear(HCDT dat, float x,float y,float z); +HMDT mgl_data_trace(HCDT d); +HMDT mgl_data_resize(HCDT dat, long mx,long my,long mz); +HMDT mgl_data_resize_box(HCDT dat, long mx,long my,long mz,float x1,float x2,float y1,float y2,float z1,float z2); +HMDT mgl_data_hist(HCDT dat, long n, float v1, float v2, long nsub); +HMDT mgl_data_hist_w(HCDT dat, HCDT weight, long n, float v1, float v2, long nsub); +HMDT mgl_data_momentum(HCDT dat, char dir, const char *how); +HMDT mgl_data_evaluate(HCDT dat, HCDT idat, HCDT jdat, HCDT kdat, int norm); +void mgl_data_envelop(HMDT dat, char dir); +void mgl_data_sew(HMDT dat, const char *dirs, float da); +void mgl_data_crop(HMDT dat, long n1, long n2, char dir); +/*****************************************************************************/ +/* Data operations */ +/*****************************************************************************/ +void mgl_data_mul_dat(HMDT dat, HCDT d); +void mgl_data_div_dat(HMDT dat, HCDT d); +void mgl_data_add_dat(HMDT dat, HCDT d); +void mgl_data_sub_dat(HMDT dat, HCDT d); +void mgl_data_mul_num(HMDT dat, float d); +void mgl_data_div_num(HMDT dat, float d); +void mgl_data_add_num(HMDT dat, float d); +void mgl_data_sub_num(HMDT dat, float d); +/*****************************************************************************/ +HMDT mgl_pde_solve(HMGL gr, const char *ham, HCDT ini_re, HCDT ini_im, float dz, float k0,const char *opt); +HMDT mgl_qo2d_solve(const char *ham, HCDT ini_re, HCDT ini_im, HCDT ray, float r, float k0, HMDT xx, HMDT yy); +HMDT mgl_ray_trace(const char *ham, float x0, float y0, float z0, float px, float py, float pz, float dt, float tmax); +HMDT mgl_jacobian_2d(HCDT x, HCDT y); +HMDT mgl_jacobian_3d(HCDT x, HCDT y, HCDT z); +HMDT mgl_transform_a(HCDT am, HCDT ph, const char *tr); +HMDT mgl_transform(HCDT re, HCDT im, const char *tr); +void mgl_data_fourier(HMDT re, HMDT im, const char *dir); +HMDT mgl_data_stfa(HCDT re, HCDT im, long dn, char dir); + +HMDT mgl_triangulation_3d(HCDT x, HCDT y, HCDT z, float er); +HMDT mgl_triangulation_2d(HCDT x, HCDT y, float er); +/*****************************************************************************/ +/* Data creation functions */ +/*****************************************************************************/ +void mgl_data_rearrange_(uintptr_t *dat, int *mx, int *my, int *mz); +void mgl_data_set_float_(uintptr_t *dat, const float *A,int *NX,int *NY,int *NZ); +void mgl_data_set_double_(uintptr_t *dat, const double *A,int *NX,int *NY,int *NZ); +void mgl_data_set_float1_(uintptr_t *d, const float *A,int *N1); +void mgl_data_set_double1_(uintptr_t *d, const double *A,int *N1); +void mgl_data_set_float2_(uintptr_t *d, const float *A,int *N1,int *N2); +void mgl_data_set_double2_(uintptr_t *d, const double *A,int *N1,int *N2); +void mgl_data_set_float3_(uintptr_t *d, const float *A,int *N1,int *N2,int *N3); +void mgl_data_set_double3_(uintptr_t *d, const double *A,int *N1,int *N2,int *N3); +void mgl_data_set_(uintptr_t *dat, uintptr_t *a); + +void mgl_data_set_value_(uintptr_t *d, float *v, int *i, int *j, int *k); +void mgl_data_set_values_(uintptr_t *d, const char *val, int *nx, int *ny, int *nz, int l); +float mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k); +int mgl_data_read_(uintptr_t *d, const char *fname,int l); +int mgl_data_read_mat_(uintptr_t *dat, const char *fname, int *dim, int); +int mgl_data_read_dim_(uintptr_t *dat, const char *fname,int *mx,int *my,int *mz,int); +void mgl_data_save_(uintptr_t *dat, const char *fname,int *ns,int); +void mgl_data_export_(uintptr_t *dat, const char *fname, const char *scheme,float *v1,float *v2,int *ns,int,int); +void mgl_data_import_(uintptr_t *dat, const char *fname, const char *scheme,float *v1,float *v2,int,int); +void mgl_data_create_(uintptr_t *dat, int *nx,int *ny,int *nz); +void mgl_data_transpose_(uintptr_t *dat, const char *dim,int); +void mgl_data_norm_(uintptr_t *dat, float *v1,float *v2,int *sym,int *dim); +void mgl_data_norm_slice_(uintptr_t *dat, float *v1,float *v2,char *dir,int *keep_en,int *sym,int l); +uintptr_t mgl_data_subdata_(uintptr_t *dat, int *xx,int *yy,int *zz); +uintptr_t mgl_data_subdata_ext_(uintptr_t *dat, uintptr_t *xx,uintptr_t *yy,uintptr_t *zz); +uintptr_t mgl_data_column_(uintptr_t *dat, const char *eq,int l); +void mgl_data_set_id_(uintptr_t *dat, const char *id,int l); +void mgl_data_fill_(uintptr_t *dat, float *x1,float *x2,const char *dir,int); +void mgl_data_fill_eq_(uintptr_t *gr, uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,const char *opt, int, int); +void mgl_data_put_val_(uintptr_t *dat, float *val, int *i, int *j, int *k); +void mgl_data_put_dat_(uintptr_t *dat, uintptr_t *val, int *i, int *j, int *k); +void mgl_data_modify_(uintptr_t *dat, const char *eq,int *dim,int); +void mgl_data_modify_vw_(uintptr_t *dat, const char *eq, uintptr_t *vdat, uintptr_t *wdat,int); +void mgl_data_squeeze_(uintptr_t *dat, int *rx,int *ry,int *rz,int *smooth); +float mgl_data_max_(uintptr_t *dat); +float mgl_data_min_(uintptr_t *dat); + +float mgl_data_first_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +float mgl_data_last_(uintptr_t *dat, const char *cond, int *i, int *j, int *k, int); +int mgl_data_find_(uintptr_t *dat, const char *cond, char *dir, int *i, int *j, int *k, int,int); +int mgl_data_find_any_(uintptr_t *dat, const char *cond, int); +float mgl_data_max_int_(uintptr_t *dat, int *i, int *j, int *k); +float mgl_data_max_real_(uintptr_t *dat, float *x, float *y, float *z); +float mgl_data_min_int_(uintptr_t *dat, int *i, int *j, int *k); +float mgl_data_min_real_(uintptr_t *dat, float *x, float *y, float *z); +float mgl_data_momentum_val_(uintptr_t *dat, char *dir, float *m, float *w, float *s, float *k,int); + +uintptr_t mgl_data_combine_(uintptr_t *dat1, uintptr_t *dat2); +void mgl_data_extend_(uintptr_t *dat, int *n1, int *n2); +void mgl_data_insert_(uintptr_t *dat, const char *dir, int *at, int *num, int); +void mgl_data_delete_(uintptr_t *dat, const char *dir, int *at, int *num, int); +/*****************************************************************************/ +/* Data manipulation functions */ +/*****************************************************************************/ +void mgl_data_smooth_(uintptr_t *dat, const char *dirs, float *delta,int); +uintptr_t mgl_data_sum_(uintptr_t *dat, const char *dir,int); +uintptr_t mgl_data_max_dir_(uintptr_t *dat, const char *dir,int); +uintptr_t mgl_data_min_dir_(uintptr_t *dat, const char *dir,int); +void mgl_data_cumsum_(uintptr_t *dat, const char *dir,int); +void mgl_data_integral_(uintptr_t *dat, const char *dir,int); +void mgl_data_diff_(uintptr_t *dat, const char *dir,int); +void mgl_data_diff_par_(uintptr_t *dat, uintptr_t *v1, uintptr_t *v2, uintptr_t *v3); +void mgl_data_diff2_(uintptr_t *dat, const char *dir,int); +void mgl_data_swap_(uintptr_t *dat, const char *dir,int); +void mgl_data_roll_(uintptr_t *dat, const char *dir, int *num, int); +void mgl_data_mirror_(uintptr_t *dat, const char *dir,int); +void mgl_data_sort_(uintptr_t *dat, int *idx, int *idy); + +void mgl_data_hankel_(uintptr_t *dat, const char *dir,int); +void mgl_data_sinfft_(uintptr_t *dat, const char *dir,int); +void mgl_data_cosfft_(uintptr_t *dat, const char *dir,int); +void mgl_data_fill_sample_(uintptr_t *dat, const char *how,int); + +float mgl_data_spline_(uintptr_t *dat, float *x,float *y,float *z); +float mgl_data_linear_(uintptr_t *dat, float *x,float *y,float *z); +uintptr_t mgl_data_trace_(uintptr_t *d); +uintptr_t mgl_data_resize_(uintptr_t *dat, int *mx,int *my,int *mz); +uintptr_t mgl_data_resize_box_(uintptr_t *dat, int *mx,int *my,int *mz,float *x1,float *x2,float *y1,float *y2,float *z1,float *z2); +uintptr_t mgl_data_momentum_(uintptr_t *dat, char *dir, const char *how, int,int); +uintptr_t mgl_data_hist_(uintptr_t *dat, int *n, float *v1, float *v2, int *nsub); +uintptr_t mgl_data_hist_w_(uintptr_t *dat, uintptr_t *weight, int *n, float *v1, float *v2, int *nsub); +uintptr_t mgl_data_evaluate_(uintptr_t *dat, uintptr_t *idat, uintptr_t *jdat, uintptr_t *kdat, int *norm); +void mgl_data_envelop_(uintptr_t *dat, const char *dir, int); +void mgl_data_sew_(uintptr_t *dat, const char *dirs, float *da, int); +void mgl_data_crop_(uintptr_t *dat, int *n1, int *n2, const char *dir,int); +/*****************************************************************************/ +/* Data operations */ +/*****************************************************************************/ +void mgl_data_mul_dat_(uintptr_t *dat, uintptr_t *d); +void mgl_data_div_dat_(uintptr_t *dat, uintptr_t *d); +void mgl_data_add_dat_(uintptr_t *dat, uintptr_t *d); +void mgl_data_sub_dat_(uintptr_t *dat, uintptr_t *d); +void mgl_data_mul_num_(uintptr_t *dat, float *d); +void mgl_data_div_num_(uintptr_t *dat, float *d); +void mgl_data_add_num_(uintptr_t *dat, float *d); +void mgl_data_sub_num_(uintptr_t *dat, float *d); +/*****************************************************************************/ +/* Nonlinear fitting */ +/*****************************************************************************/ +uintptr_t mgl_pde_solve_(uintptr_t* gr, const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, float *dz, float *k0,const char *opt,int,int); +uintptr_t mgl_qo2d_solve_(const char *ham, uintptr_t* ini_re, uintptr_t* ini_im, uintptr_t* ray, float *r, float *k0, uintptr_t* xx, uintptr_t* yy, int); +uintptr_t mgl_ray_trace_(const char *ham, float *x0, float *y0, float *z0, float *px, float *py, float *pz, float *dt, float *tmax,int); +uintptr_t mgl_jacobian_2d_(uintptr_t* x, uintptr_t* y); +uintptr_t mgl_jacobian_3d_(uintptr_t* x, uintptr_t* y, uintptr_t* z); + +uintptr_t mgl_transform_a_(uintptr_t *am, uintptr_t *ph, const char *tr, int); +uintptr_t mgl_transform_(uintptr_t *re, uintptr_t *im, const char *tr, int); +void mgl_data_fourier_(uintptr_t *re, uintptr_t *im, const char *dir, int l); +uintptr_t mgl_data_stfa_(uintptr_t *re, uintptr_t *im, int *dn, char *dir, int); + +uintptr_t mgl_triangulation_3d_(uintptr_t *x, uintptr_t *y, uintptr_t *z, float *er); +uintptr_t mgl_triangulation_2d_(uintptr_t *x, uintptr_t *y, float *er); +/*****************************************************************************/ +int mgl_data_read_hdf_(uintptr_t *d, const char *fname, const char *data,int l,int n); +void mgl_data_link_(uintptr_t *d, float *A, int *nx,int *ny,int *nz); +void mgl_data_save_hdf_(uintptr_t *d, const char *fname, const char *data, int *rewrite,int l,int n); +int mgl_data_read_range_(uintptr_t *d, const char *fname, double *from, double *to, double *step, int *as_slice,int l); +int mgl_data_read_all_(uintptr_t *d, const char *fname, int *as_slice,int l); +/*****************************************************************************/ +#ifdef __cplusplus +} +#endif +#endif diff --git a/include/mgl/fltk.h b/include/mgl/fltk.h index 84441f7..72abf46 100644 --- a/include/mgl/fltk.h +++ b/include/mgl/fltk.h @@ -22,7 +22,7 @@ #define _MGL_FLTK_H_ /*****************************************************************************/ #ifdef __cplusplus -#include "mgl/window.h" +#include "mgl/canvas_wnd.h" //----------------------------------------------------------------------------- #ifdef __MWERKS__ # define FL_DLL @@ -76,7 +76,7 @@ public: { popup = pmenu; wpar = wdg; vpar = v; } protected: mglCanvas *gr; ///< pointer to grapher - void *draw_par; ///< Parameters for drawing function mglCanvasW::DrawFunc. + void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. /// Drawing function for window procedure. It should return the number of frames. int (*draw_func)(mglBase *gr, void *par); @@ -136,10 +136,10 @@ protected: //----------------------------------------------------------------------------- /// Class allows the window creation for displaying plot bitmap with the help of FLTK library /** NOTE!!! All frames are saved in memory. So animation with many frames require a lot memory and CPU time (for example, for mouse rotation).*/ -class mglCanvasFL : public mglCanvasW +class mglCanvasFL : public mglCanvasWnd { public: -using mglCanvasW::Window; +using mglCanvasWnd::Window; Fl_Window *Wnd; ///< Pointer to window Fl_MGLView *mgl; ///< Pointer to MGL widget with buttons diff --git a/include/mgl/glut.h b/include/mgl/glut.h index 558bfeb..aea0bc6 100644 --- a/include/mgl/glut.h +++ b/include/mgl/glut.h @@ -29,8 +29,6 @@ extern "C" { /*****************************************************************************/ void _mgl_key_up(unsigned char ch,int ,int ); HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, void *par); -/*int mgl_fortran_func(HMGL gr, void *); -uintptr_t mgl_create_graph_glut_(const char *title, int);*/ /*****************************************************************************/ #ifdef __cplusplus } diff --git a/include/mgl/mgl.h b/include/mgl/mgl.h index 4f9d536..a3ffb65 100644 --- a/include/mgl/mgl.h +++ b/include/mgl/mgl.h @@ -27,8 +27,6 @@ #include "mgl/opengl.h" #endif //----------------------------------------------------------------------------- -const float NaN = NAN; -//----------------------------------------------------------------------------- /// Wrapper class for all graphics class mglGraph { @@ -1135,12 +1133,14 @@ public: ~mglExpr() { mgl_delete_expr(ex); } inline mreal Eval(mreal x, mreal y=0, mreal z=0) { return mgl_expr_eval(ex,x,y,z); } - inline mreal Eval(mreal var[26]) - { return mgl_expr_eval_v(ex,var); } inline mreal Diff(char dir, mreal x, mreal y=0, mreal z=0) { return mgl_expr_diff(ex,dir, x,y,z); } +#ifndef SWIG + inline mreal Eval(mreal var[26]) + { return mgl_expr_eval_v(ex,var); } inline mreal Diff(char dir, mreal var[26]) { return mgl_expr_diff_v(ex,dir, var); } +#endif }; //----------------------------------------------------------------------------- #endif diff --git a/include/mgl/mgl_cf.h b/include/mgl/mgl_cf.h index b4a37c0..7f69fef 100644 --- a/include/mgl/mgl_cf.h +++ b/include/mgl/mgl_cf.h @@ -21,7 +21,7 @@ #define _MGL_CF_H_ /*****************************************************************************/ #include "mgl/base_cf.h" -#include "mgl/data.h" +#include "mgl/data_cf.h" #include "mgl/cont.h" #include "mgl/fit.h" #include "mgl/plot.h" diff --git a/include/mgl/qt.h b/include/mgl/qt.h index ceb976a..bf8c97d 100644 --- a/include/mgl/qt.h +++ b/include/mgl/qt.h @@ -22,7 +22,7 @@ /*****************************************************************************/ #ifdef __cplusplus //----------------------------------------------------------------------------- -#include "mgl/window.h" +#include "mgl/canvas_wnd.h" #include #include //----------------------------------------------------------------------------- @@ -141,7 +141,7 @@ protected: void mouseMoveEvent(QMouseEvent *); mglCanvas *gr; ///< Built-in mglCanvasQT-er instance (used by default) - void *draw_par; ///< Parameters for drawing function mglCanvasW::DrawFunc. + void *draw_par; ///< Parameters for drawing function mglCanvasWnd::DrawFunc. /// Drawing function for window procedure. It should return the number of frames. int (*draw_func)(mglBase *gr, void *par); QString mousePos; ///< Last mouse position @@ -163,10 +163,10 @@ private: }; //----------------------------------------------------------------------------- /// Base class for windows containing MathGL graphics -class mglCanvasQT : public mglCanvasW +class mglCanvasQT : public mglCanvasWnd { public: -using mglCanvasW::Window; +using mglCanvasWnd::Window; int sshow; ///< Current state of animation switch (toggle button) QMathGL *QMGL; ///< Control which draw graphics QMainWindow *Wnd; ///< Pointer to window @@ -206,7 +206,7 @@ struct mglDrawScript : public mglDraw { gr->Highlight(line+1); mgl_parse_text(gr->Self(),par,text.toAscii()); return 0; } }; //----------------------------------------------------------------------------- -/// Convert bitmap from mglCanvasW to QPixmap +/// Convert bitmap from mglCanvasWnd to QPixmap void mglConvertFromGraph(QPixmap &pic, mglCanvas *gr, uchar **buf); /// Make menu, toolbars and return popup menu for MainWindow QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi); diff --git a/include/mgl/type.h b/include/mgl/type.h index 600af80..88c1ce9 100644 --- a/include/mgl/type.h +++ b/include/mgl/type.h @@ -25,6 +25,9 @@ #endif #include "mgl/define.h" //----------------------------------------------------------------------------- +const mreal Pi = M_PI; +const mreal NaN = NAN; +//----------------------------------------------------------------------------- /// Class for incapsulating point in space struct mglPoint { @@ -42,6 +45,7 @@ struct mglPoint inline void operator*=(float a) { x*=a; y*=a; z*=a; } inline void operator/=(float a) { x/=a; y/=a; z/=a; } }; +#ifndef SWIG inline mglPoint operator+(const mglPoint &a, const mglPoint &b) { return mglPoint(a.x+b.x, a.y+b.y, a.z+b.z, a.c+b.c); } inline mglPoint operator-(const mglPoint &a, const mglPoint &b) @@ -72,6 +76,7 @@ inline bool operator!=(const mglPoint &a, const mglPoint &b) { return memcmp(&a, &b, sizeof(mglPoint)); } inline float mgl_norm(const mglPoint &p) { return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); } +#endif //----------------------------------------------------------------------------- /// Class for incapsulating color struct mglColor @@ -109,6 +114,7 @@ struct mglColor inline void operator+=(const mglColor &c) { r+=c.r; g+=c.g; b+=c.b; } inline void operator-=(const mglColor &c) { r-=c.r; g-=c.g; b-=c.b; } }; +#ifndef SWIG inline mglColor operator+(const mglColor &a, const mglColor &b) { return mglColor(a.r+b.r, a.g+b.g, a.b+b.b, a.a+b.a); } inline mglColor operator-(const mglColor &a, const mglColor &b) @@ -121,5 +127,6 @@ inline mglColor operator/(const mglColor &a, float b) { return mglColor(a.r/b, a.g/b, a.b/b, a.a/b); } inline mglColor operator!(const mglColor &a) { return mglColor(1-a.r, 1-a.g, 1-a.b, a.a); } +#endif //----------------------------------------------------------------------------- #endif \ No newline at end of file diff --git a/include/mgl/window.h b/include/mgl/window.h index 7bab88d..e46497f 100644 --- a/include/mgl/window.h +++ b/include/mgl/window.h @@ -38,44 +38,52 @@ struct mglDraw { mgl_draw_thr(this); } #endif }; -void mgl_reload_class(void *p); typedef int (*draw_func)(mglGraph *gr); int mgl_draw_graph(mglBase *gr, void *p); -// NOTE: mgl_draw_class() use mglWindow* only. Don't use it with inherited classes +// NOTE: mgl_draw_class() and mgl_draw_load() use mglWindow* only. Don't use it with inherited classes int mgl_draw_class(mglBase *gr, void *p); +void mgl_reload_class(void *p); //----------------------------------------------------------------------------- #if MGL_HAVE_QT #define MGL_WND_KIND 1 #else #define MGL_WND_KIND 0 #endif +/// Wrapper class for windows displaying graphics class mglWindow : public mglGraph { friend int mgl_draw_class(mglBase *gr, void *p); +friend void mgl_reload_class(void *p); protected: mglDraw *dr; int wnd; ///< Type of window public: - mglWindow(int (*draw)(HMGL gr, void *p)=NULL, const char *title="MathGL", void *par=NULL, int kind=MGL_WND_KIND) : mglGraph(-1) + mglWindow(const char *title="MathGL") : mglGraph(-1) + { wnd=0; dr=0; gr = mgl_create_graph_fltk(0,title,0,0); } + inline int RunThr() ///< Run main loop for event handling in separate thread (for FLTK only) + { return wnd==0 ? mgl_fltk_thr():0; } +#ifndef SWIG + mglWindow(int (*draw)(HMGL gr, void *p), const char *title="MathGL", void *par=NULL, int kind=MGL_WND_KIND, void (*load)(void *p)=0) : mglGraph(-1) { wnd=kind; dr=0; - if(wnd==1) gr = mgl_create_graph_qt(draw,title,par); - else gr = mgl_create_graph_fltk(draw,title,par); + if(wnd==1) gr = mgl_create_graph_qt(draw,title,par,load); + else gr = mgl_create_graph_fltk(draw,title,par,load); } mglWindow(int (*draw)(mglGraph *gr), const char *title="MathGL", int kind=MGL_WND_KIND) : mglGraph(-1) { wnd=kind; dr=0; - if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_graph,title,(void*)draw); - else gr = mgl_create_graph_fltk(mgl_draw_graph,title,(void*)draw); + if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_graph,title,(void*)draw,0); + else gr = mgl_create_graph_fltk(mgl_draw_graph,title,(void*)draw,0); } mglWindow(mglDraw *draw, const char *title="MathGL", int kind=MGL_WND_KIND) : mglGraph(-1) { wnd=kind; dr=draw; - if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_class,title,this); - else gr = mgl_create_graph_fltk(mgl_draw_class,title,this); + if(wnd==1) gr = mgl_create_graph_qt(mgl_draw_class,title,this,mgl_reload_class); + else gr = mgl_create_graph_fltk(mgl_draw_class,title,this,mgl_reload_class); } inline int Run() ///< Run main loop for event handling { return (wnd==1)? mgl_qt_run() : mgl_fltk_run(); } +#endif inline void ToggleAlpha() ///< Switch on/off transparency (do not overwrite user settings) { mgl_wnd_toggle_alpha(gr); } @@ -108,58 +116,4 @@ public: { mglPoint p; mgl_get_last_mouse_pos(gr,&p.x,&p.y,&p.z); return p; } }; //----------------------------------------------------------------------------- -/// Base class for windows containing MathGL graphics -class mglCanvasW : public mglCanvas -{ -public: - mglCanvasW(); - virtual ~mglCanvasW(); - - void SetSize(int w,int h); - void EndFrame(); - const unsigned char *GetBits(); - inline int GetNumFig() { return NumFig; } - inline int GetCurFig() { return CurFig; } - void SetCurFig(int c); - void ClearFrames(); - inline mglPoint GetMousePos() { return LastMousePos;} // stupid thing to pass G++ bug - inline void SetMousePos(mglPoint p) { LastMousePos=p; } - inline void Setup(bool clf_upd=true, bool showpos=false) - { set(showpos,MGL_SHOW_POS); set(clf_upd,MGL_CLF_ON_UPD); } - - virtual void ToggleAlpha()=0; ///< Switch on/off transparency (do not overwrite user settings) - virtual void ToggleLight()=0; ///< Switch on/off lighting (do not overwrite user settings) - virtual void ToggleZoom()=0; ///< Switch on/off zooming by mouse - virtual void ToggleRotate()=0; ///< Switch on/off rotation by mouse - virtual void ToggleNo()=0; ///< Switch off all zooming and rotation - virtual void Update()=0; ///< Update picture by calling user drawing function - virtual void Adjust()=0; ///< Adjust size of bitmap to window size - virtual void GotoFrame(int d)=0;///< Show arbitrary frame (use relative step) - virtual void NextFrame() {GotoFrame(+1);} ///< Show next frame (if one) - virtual void PrevFrame() {GotoFrame(-1);} ///< Show previous frame (if one) - virtual void Animation()=0; ///< Run slideshow (animation) of frames - void ReLoad(); ///< Reload user data and update picture - /// Create a window for plotting based on callback function (can be NULL). - virtual void Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), - const char *title, void *par=NULL, - void (*reload)(void *p)=NULL, bool maximize=false)=0; - void Window(int argc, char **argv, int (*draw)(mglGraph *gr), const char *title, bool maximize=false) - { Window(argc,argv,mgl_draw_graph,title,(void*)draw,0,maximize); } - /// Create a window for plotting based on class mglDraw. - void Window(int argc, char **argv, const char *title, mglDraw *draw, bool maximize=false) - { Window(argc, argv, mgl_draw_class, title, draw, mgl_reload_class, maximize); } - void SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par=NULL, void (*reload)(void *p)=NULL); - -private: - mglPoint LastMousePos; ///< Last mouse position - int CurFig; ///< Current figure in the list. - - unsigned char *GG; ///< images for all frames (may be too LARGE !!!) - int NumFig; ///< Number of figures in the list. If 0 then no list and mglCanvas::DrawFunc will called for each drawing. - void (*LoadFunc)(void *par); - void *FuncPar; ///< Parameters for drawing function mglCanvas::DrawFunc. - /// Drawing function for window procedure. It should return the number of frames. - int (*DrawFunc)(mglBase *gr, void *par); -}; -//----------------------------------------------------------------------------- #endif diff --git a/lang/CMakeLists.txt b/lang/CMakeLists.txt index f18f5b6..edee957 100644 --- a/lang/CMakeLists.txt +++ b/lang/CMakeLists.txt @@ -2,11 +2,11 @@ if(MGL_HAVE_PYTHON) configure_file(${MathGL_SOURCE_DIR}/lang/mgl.i ${MathGL_BINARY_DIR}/lang/mgl.i COPYONLY) configure_file(${MathGL_SOURCE_DIR}/lang/numpy.i ${MathGL_BINARY_DIR}/lang/numpy.i COPYONLY) SET(dep_libs mgl) - if(MGL_HAVE_FLTK) +# if(MGL_HAVE_FLTK) get_property(path_to_mglwnd TARGET mgl-wnd PROPERTY LOCATION) file(TO_NATIVE_PATH ${path_to_mglwnd} MGL_LIB_WND) SET(dep_libs ${dep_libs} mgl-wnd) - endif(MGL_HAVE_FLTK) +# endif(MGL_HAVE_FLTK) get_property(path_to_mgl TARGET mgl PROPERTY LOCATION) file(TO_NATIVE_PATH ${path_to_mgl} MGL_LIB) file(TO_NATIVE_PATH ${MathGL_BINARY_DIR}/lang/mgl.i MGL_I) @@ -31,7 +31,7 @@ if(MGL_HAVE_PYTHON) add_custom_command(OUTPUT _mathgl.so mathgl.py COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_BINARY_DIR}/lang/setup.py build DEPENDS ${dep_libs} ${CMAKE_BINARY_DIR}/lang/mgl.i ${CMAKE_BINARY_DIR}/lang/numpy.i - IMPLICIT_DEPENDS CXX ${CMAKE_SOURCE_DIR}/include/mgl/type.h ${CMAKE_SOURCE_DIR}/include/mgl/data.h ${CMAKE_SOURCE_DIR}/include/mgl/mgl.h + IMPLICIT_DEPENDS CXX ${CMAKE_SOURCE_DIR}/include/mgl/type.h ${CMAKE_SOURCE_DIR}/include/mgl/data.h ${CMAKE_SOURCE_DIR}/include/mgl/mgl.h ${CMAKE_SOURCE_DIR}/include/mgl/window.h WORKING_DIRECTORY ${CMAKE_BINARY_DIR}/lang ) add_custom_target(mgl_python_module ALL DEPENDS _mathgl.so mathgl.py) diff --git a/lang/mgl.i b/lang/mgl.i index dd4c5d2..12548c6 100644 --- a/lang/mgl.i +++ b/lang/mgl.i @@ -21,7 +21,6 @@ ***************************************************************************/ %module mathgl -#define MGL_NO_WIDGET #ifdef SWIGOCTAVE %feature("autodoc", 1); #endif // SWIGOCTAVE @@ -33,14 +32,23 @@ %ignore *::operator-=; %ignore *::operator*=; %ignore *::operator/=; +//%ignore mglDataA %{ #define SWIG_FILE_WITH_INIT #include "mgl/type.h" #include "mgl/data.h" #include "mgl/mgl.h" +#include "mgl/window.h" %} +#if MGL_USE_DOUBLE +typedef double mreal; +#else +typedef float mreal; +#endif + + #ifdef SWIGOCTAVE %rename(__add) operator+; %rename(__sub) operator-; @@ -82,6 +90,7 @@ import_array(); %include "mgl/type.h" %include "mgl/data.h" %include "mgl/mgl.h" +%include "mgl/window.h" %extend mglData { float __getitem__( int i) { return self->GetVal(i); }; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2ca1681..294c5bb 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -7,14 +7,14 @@ plot.cpp prim.cpp surf.cpp tex_table.cpp vect.cpp volume.cpp evalc.cpp #window.c ) set(mgl_hdr -../include/mgl/base_cf.h ../include/mgl/fit.h ../include/mgl/plot.h -../include/mgl/base.h ../include/mgl/prim.h ../include/mgl/canvas_cf.h -../include/mgl/font.h ../include/mgl/canvas.h ../include/mgl/surf.h -${MathGL_BINARY_DIR}/include/mgl/config.h ../include/mgl/mgl_cf.h ../include/mgl/type.h -../include/mgl/cont.h ../include/mgl/mgl.h ../include/mgl/vect.h -../include/mgl/data.h ../include/mgl/volume.h -../include/mgl/define.h ../include/mgl/other.h ../include/mgl/eval.h -../include/mgl/parser.h ../include/mgl/addon.h ../include/mgl/evalc.h ) +../include/mgl/base_cf.h ../include/mgl/fit.h ../include/mgl/plot.h +../include/mgl/base.h ../include/mgl/prim.h ../include/mgl/canvas_cf.h +../include/mgl/font.h ../include/mgl/canvas.h ../include/mgl/surf.h +../include/mgl/mgl_cf.h ../include/mgl/type.h ${MathGL_BINARY_DIR}/include/mgl/config.h +../include/mgl/cont.h ../include/mgl/mgl.h ../include/mgl/vect.h +../include/mgl/data.h ../include/mgl/volume.h ../include/mgl/data_cf.h +../include/mgl/define.h ../include/mgl/other.h ../include/mgl/eval.h +../include/mgl/parser.h ../include/mgl/addon.h ../include/mgl/evalc.h ) if(MGL_HAVE_OPENGL) set(mgl_src ${mgl_src} opengl.cpp ) diff --git a/src/data.cpp b/src/data.cpp index 9a505aa..6644c06 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -1580,3 +1580,7 @@ float mgl_data_get_value_(uintptr_t *d, int *i, int *j, int *k) //----------------------------------------------------------------------------- mreal *mgl_data_data(HMDT dat) { return dat->a; } //----------------------------------------------------------------------------- +mreal *mgl_data_value(HMDT dat, long i,long j,long k) +{ register long ii=i*dat->nx*(j+dat->ny*k); + return ii>=0 && iiGetNN() ? dat->a+ii : 0; } +//----------------------------------------------------------------------------- diff --git a/texinfo/toc_en.html b/texinfo/toc_en.html index 72ce447..584acfd 100644 --- a/texinfo/toc_en.html +++ b/texinfo/toc_en.html @@ -11,7 +11,7 @@ Pictures

MGL scripts

Download

-Documentation

+Documentation

Other projects


diff --git a/texinfo/web_en.texi b/texinfo/web_en.texi index ab21e0e..4329747 100644 --- a/texinfo/web_en.texi +++ b/texinfo/web_en.texi @@ -67,7 +67,6 @@ supports it in developing GNU and promoting software freedom.'' * Pictures:: * MGL scripts:: * Download:: -* Documentation:: * Other projects:: @end menu @@ -415,7 +414,7 @@ For more details see @uref{../mathgl_en/mathgl_en_64.html#MGL-scripts, MathGL do @external -@node Download, Documentation, MGL scripts, Top +@node Download, Other projects, MGL scripts, Top @section Download @strong{Stable version (v.2.0)} @@ -486,18 +485,7 @@ There are a set of @uref{http://sourceforge.net/project/showfiles.php?group_id=1 @external -@node Documentation, Other projects, Download, Top -@section Documentation - -Here you can view and download latest version of documentation. This documentation is just compiled version of @uref{https://sourceforge.net/svn/?group_id=152187,SVN} documentation. - -There are @uref{../mathgl_en/mathgl_en.html,English} and @uref{../mathgl_ru/mathgl_ru.html,Russian} versions. It also include @uref{../mathgl_en/mathgl_en_18.html#FAQ,FAQ} about MathGL. - -Another variant is download single @uref{mathgl_en.pdf,PDF} (about 7 Mb). - -@external - -@node Other projects, , Documentation, Top +@node Other projects, , Download, Top @section Other projects Except scientific (non public) projects I also have some general interest projects: diff --git a/texinfo/widget_en.texi b/texinfo/widget_en.texi index e3aa3fd..5c0b522 100644 --- a/texinfo/widget_en.texi +++ b/texinfo/widget_en.texi @@ -37,7 +37,8 @@ You should inherit yours class from @code{mglDraw} and re-implement one or both This class is derived from mglGraph class (@pxref{MathGL core}). It provide methods for handling window with MathGL graphics. -@deftypefn {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p)=@code{NULL}, @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0}) +@deftypefn {Constructor on @code{mglWindow}} {} mglWindow (@code{const char *}title=@code{"MathGL"}) +@deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title=@code{"MathGL"}, @code{void *}par=@code{NULL}, @code{int} kind=@code{0}) @deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{int} (*draw)(@code{mglGraph *}gr), @code{const char *}title=@code{"MathGL"}, @code{int} kind=@code{0}) @deftypefnx {Constructor on @code{mglWindow}} {} mglWindow (@code{mglDraw *}draw, @code{const char *}title=@code{"MathGL"}, @code{int} kind=@code{0}) @deftypefnx {C function} @code{HMGL} mgl_create_graph_qt (@code{int} (*draw)(@code{HMGL} gr, @code{void *}p), @code{const char *}title, @code{void *}par) @@ -49,6 +50,12 @@ Creates a window for plotting. Parameter @var{draw} sets a pointer to drawing fu There are some keys handles for manipulating by the plot: 'a', 'd', 'w', 's' for the rotating; ',', '.' for viewing of the previous or next frames in the list; 'r' for the switching of transparency; 'f' for the switching of lightning; 'x' for hiding (closing) the window. @end deftypefn +@deftypefn {Method on @code{mglWindow}} @code{void} RunThr () +@c @deftypefnx {C function} @code{HMGL} mgl_qt_run () +@deftypefnx {C function} @code{HMGL} mgl_fltk_thr () +Run main loop for event handling in separate thread. Note, right now it work for FLTK windows only. +@end deftypefn + @deftypefn {Method on @code{mglWindow}} @code{void} Run () @deftypefnx {C function} @code{HMGL} mgl_qt_run () @deftypefnx {C function} @code{HMGL} mgl_fltk_run () diff --git a/widgets/CMakeLists.txt b/widgets/CMakeLists.txt index 78cb132..0ee61d6 100644 --- a/widgets/CMakeLists.txt +++ b/widgets/CMakeLists.txt @@ -1,4 +1,4 @@ -set(mgl_wnd_hdr ../include/mgl/window.h) +set(mgl_wnd_hdr ../include/mgl/window.h ../include/mgl/canvas_wnd.h) set(mgl_wnd_src window.cpp) #set(mgl_wnd_src ) diff --git a/widgets/fltk.cpp b/widgets/fltk.cpp index e63661b..8c73ded 100644 --- a/widgets/fltk.cpp +++ b/widgets/fltk.cpp @@ -598,7 +598,7 @@ Fl_MGLView::~Fl_MGLView() {} // class mglCanvasFL // //----------------------------------------------------------------------------- -mglCanvasFL::mglCanvasFL() : mglCanvasW() { Wnd=0; } +mglCanvasFL::mglCanvasFL() : mglCanvasWnd() { Wnd=0; } mglCanvasFL::~mglCanvasFL() { if(Wnd) delete Wnd; } //----------------------------------------------------------------------------- void mglCanvasFL::GotoFrame(int d) @@ -609,10 +609,10 @@ void mglCanvasFL::GotoFrame(int d) if(GetNumFig()>0 && d) { SetCurFig(f); mgl->FMGL->redraw(); } } //----------------------------------------------------------------------------- -void mgl_fl_next(void *v) { ((mglCanvasW*)v)->NextFrame(); } ///< Callback function for next frame -void mgl_fl_prev(void *v) { ((mglCanvasW*)v)->PrevFrame(); } ///< Callback function for prev frame -void mgl_fl_reload(void *v) { ((mglCanvasW*)v)->ReLoad(); } ///< Callback function for reloading -float mgl_fl_delay(void *v) { return ((mglCanvasW*)v)->GetDelay(); } ///< Callback function for delay +void mgl_fl_next(void *v) { ((mglCanvasWnd*)v)->NextFrame(); } ///< Callback function for next frame +void mgl_fl_prev(void *v) { ((mglCanvasWnd*)v)->PrevFrame(); } ///< Callback function for prev frame +void mgl_fl_reload(void *v) { ((mglCanvasWnd*)v)->ReLoad(); } ///< Callback function for reloading +float mgl_fl_delay(void *v) { return ((mglCanvasWnd*)v)->GetDelay(); } ///< Callback function for delay //----------------------------------------------------------------------------- void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p), const char *title, void *par, void (*reload)(void *p), bool maximize) { @@ -647,19 +647,11 @@ void mglCanvasFL::Window(int argc, char **argv, int (*draw)(mglBase *gr, void *p delete []tmp[0]; } //----------------------------------------------------------------------------- -HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par) +HMGL mgl_create_graph_fltk(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)) { mglCanvasFL *g = new mglCanvasFL; - g->Window(0,0,draw,title,par); + g->Window(0,0,draw,title,par,load); return g; } int mgl_fltk_run() { return Fl::run(); } //----------------------------------------------------------------------------- -void *mgl_fl_tmp(void *) { Fl::run(); return 0; } -/*void mgl_fltk_thread() - * { - * static pthread_t tmp; - * pthread_create(&tmp, 0, mgl_fl_tmp, 0); - * pthread_detach(tmp); - * }*/ -//----------------------------------------------------------------------------- diff --git a/widgets/glut.cpp b/widgets/glut.cpp index da5eefb..66b56f6 100644 --- a/widgets/glut.cpp +++ b/widgets/glut.cpp @@ -196,13 +196,13 @@ HMGL mgl_create_graph_glut(int (*draw)(HMGL gr, void *p), const char *title, voi mglCanvasGLUT::mglCanvasGLUT() : mglCanvasGL() {} //----------------------------------------------------------------------------- #if MGL_HAVE_FLTK -HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *) +HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) { return NULL; } int mgl_fltk_run(){return 0;} #endif //----------------------------------------------------------------------------- #if MGL_HAVE_QT -HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *) +HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) { return NULL; } int mgl_qt_run(){return 0;} #endif diff --git a/widgets/qt.cpp b/widgets/qt.cpp index 28428ee..16dabc1 100644 --- a/widgets/qt.cpp +++ b/widgets/qt.cpp @@ -533,13 +533,13 @@ void QMathGL::print() //----------------------------------------------------------------------------- void QMathGL::nextSlide() { - mglCanvasW *g = dynamic_cast(gr); + mglCanvasWnd *g = dynamic_cast(gr); if(g && g->GetNumFig()>1) g->NextFrame(); emit frameChanged(+1); } void QMathGL::prevSlide() { - mglCanvasW *g = dynamic_cast(gr); + mglCanvasWnd *g = dynamic_cast(gr); if(g && g->GetNumFig()>1) g->PrevFrame(); emit frameChanged(-1); } @@ -561,7 +561,7 @@ void QMathGL::adjust() // class mglCanvasQT // //----------------------------------------------------------------------------- -mglCanvasQT::mglCanvasQT() : mglCanvasW() +mglCanvasQT::mglCanvasQT() : mglCanvasWnd() { Wnd = 0; } //----------------------------------------------------------------------------- void mglCanvasQT::GotoFrame(int d) @@ -792,19 +792,11 @@ QMenu *mglMakeMenu(QMainWindow *Wnd, QMathGL *QMGL, QSpinBox *tet, QSpinBox *phi o->addAction(TR("About &Qt"), QMGL, SLOT(aboutQt())); } //----------------------------------------------------------------------------- -HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par) +HMGL mgl_create_graph_qt(int (*draw)(HMGL gr, void *p), const char *title, void *par, void (*load)(void *p)) { mglCanvasQT *g = new mglCanvasQT; - g->Window(0,0,draw,title,par); + g->Window(0,0,draw,title,par,load); return g; } int mgl_qt_run() { return (qApp)?qApp->exec():-1; } //----------------------------------------------------------------------------- -void *mgl_qt_tmp(void *) { mgl_qt_run(); return 0; } -/*void mgl_qt_thread() - * { - * static pthread_t tmp; - * pthread_create(&tmp, 0, mgl_qt_tmp, 0); - * pthread_detach(tmp); - }*/ -//----------------------------------------------------------------------------- diff --git a/widgets/window.cpp b/widgets/window.cpp index c0fce90..70a69fd 100644 --- a/widgets/window.cpp +++ b/widgets/window.cpp @@ -17,34 +17,34 @@ * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -#include "mgl/window.h" +#include "mgl/canvas_wnd.h" //----------------------------------------------------------------------------- -mglCanvasW::mglCanvasW() : mglCanvas() +mglCanvasWnd::mglCanvasWnd() : mglCanvas() { Setup(); LoadFunc=0; FuncPar=0; DrawFunc=0; GG = 0; NumFig = 0; CurFig = -1; // set(MGL_USEDRWDAT); // TODO: experimental feature -- test later } //----------------------------------------------------------------------------- -mglCanvasW::~mglCanvasW() { if(GG) free(GG); } +mglCanvasWnd::~mglCanvasWnd() { if(GG) free(GG); } //----------------------------------------------------------------------------- -void mglCanvasW::SetCurFig(int c) { CurFig=c; if(get(MGL_USEDRWDAT)) GetDrwDat(c); } +void mglCanvasWnd::SetCurFig(int c) { CurFig=c; if(get(MGL_USEDRWDAT)) GetDrwDat(c); } //----------------------------------------------------------------------------- -void mglCanvasW::ClearFrames() +void mglCanvasWnd::ClearFrames() { if(GG) free(GG); GG = 0; CurFrameId = NumFig = CurFig = 0; DrwDat.clear(); } //----------------------------------------------------------------------------- -void mglCanvasW::SetSize(int w,int h) +void mglCanvasWnd::SetSize(int w,int h) { ClearFrames(); mglCanvas::SetSize(w,h); // if(Wnd) Wnd->size(w,h); } //----------------------------------------------------------------------------- -void mglCanvasW::EndFrame() +void mglCanvasWnd::EndFrame() { CurFig = CurFrameId-1; if(!GG) @@ -62,7 +62,7 @@ void mglCanvasW::EndFrame() CurFig++; } //----------------------------------------------------------------------------- -void mglCanvasW::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void (*reload)(void *p)) +void mglCanvasWnd::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void (*reload)(void *p)) { ClearFrames(); int n = draw ? draw(this,par) : 0; @@ -71,7 +71,7 @@ void mglCanvasW::SetDrawFunc(int (*draw)(mglBase *gr, void *p), void *par, void LoadFunc = reload; } //----------------------------------------------------------------------------- -const unsigned char *mglCanvasW::GetBits() +const unsigned char *mglCanvasWnd::GetBits() { const unsigned char *g = mglCanvas::GetBits(); if(GG && NumFig>0 && CurFig=0) @@ -79,7 +79,7 @@ const unsigned char *mglCanvasW::GetBits() return g; } //----------------------------------------------------------------------------- -void mglCanvasW::ReLoad() +void mglCanvasWnd::ReLoad() { if(LoadFunc) { @@ -93,69 +93,77 @@ void mglCanvasW::ReLoad() } //----------------------------------------------------------------------------- void mgl_wnd_toggle_alpha(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ToggleAlpha(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ToggleAlpha(); } void mgl_wnd_toggle_light(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ToggleLight(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ToggleLight(); } void mgl_wnd_toggle_zoom(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ToggleZoom(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ToggleZoom(); } void mgl_wnd_toggle_rotate(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ToggleRotate(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ToggleRotate(); } void mgl_wnd_toggle_no(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ToggleNo(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ToggleNo(); } void mgl_wnd_update(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->Update(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->Update(); } void mgl_wnd_reload(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->ReLoad(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->ReLoad(); } void mgl_wnd_adjust(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->Adjust(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->Adjust(); } void mgl_wnd_next_frame(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->NextFrame(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->NextFrame(); } void mgl_wnd_prev_frame(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->PrevFrame(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->PrevFrame(); } void mgl_wnd_animation(HMGL gr) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->Animation(); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->Animation(); } void mgl_setup_window(HMGL gr, int clf_upd, int showpos) -{ mglCanvasW *g = dynamic_cast(gr); if(g) g->Setup(clf_upd, showpos); } +{ mglCanvasWnd *g = dynamic_cast(gr); if(g) g->Setup(clf_upd, showpos); } //----------------------------------------------------------------------------- void mgl_wnd_toggle_alpha_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ToggleAlpha(); } void mgl_wnd_toggle_light_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ToggleLight(); } void mgl_wnd_toggle_zoom_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ToggleZoom(); } void mgl_wnd_toggle_rotate_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ToggleRotate(); } void mgl_wnd_toggle_no_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ToggleNo(); } void mgl_wnd_update_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->Update(); } void mgl_wnd_reload_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->ReLoad(); } void mgl_wnd_adjust_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->Adjust(); } void mgl_wnd_next_frame_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->NextFrame(); } void mgl_wnd_prev_frame_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->PrevFrame(); } void mgl_wnd_animation_(uintptr_t *gr) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->Animation(); } void mgl_setup_window_(uintptr_t *gr, int *clf_upd, int *showpos) -{ mglCanvasW *g = dynamic_cast((HMGL)(*gr)); +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); if(g) g->Setup(*clf_upd, *showpos); } +void mgl_get_last_mouse_pos_(uintptr_t *gr, float *x, float *y, float *z) +{ mglCanvasWnd *g = dynamic_cast((HMGL)(*gr)); + mglPoint p; if(g) g->GetMousePos(); + *x=p.x; *y=p.y; *z=p.z; } +void mgl_get_last_mouse_pos(HMGL gr, float *x, float *y, float *z) +{ mglCanvasWnd *g = dynamic_cast(gr); + mglPoint p; if(g) g->GetMousePos(); + *x=p.x; *y=p.y; *z=p.z; } //----------------------------------------------------------------------------- #if MGL_HAVE_FLTK==0 -HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *) +HMGL mgl_create_graph_fltk(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) { return NULL; } int mgl_fltk_run(){return 0;} #endif @@ -163,13 +171,25 @@ int mgl_fltk_run(){return 0;} uintptr_t mgl_create_graph_fltk_(const char *title, int l) { char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; - uintptr_t t = uintptr_t(mgl_create_graph_fltk(0,s,0)); + uintptr_t t = uintptr_t(mgl_create_graph_fltk(0,s,0,0)); delete []s; return t; } int mgl_fltk_run_() { return mgl_fltk_run(); } //----------------------------------------------------------------------------- +void *mgl_fltk_tmp(void *) +{ mgl_fltk_run(); return 0; } +//----------------------------------------------------------------------------- +int mgl_fltk_thr() // NOTE: Qt couldn't be running in non-primary thread +{ + static pthread_t thr; + pthread_create(&thr,0,mgl_fltk_tmp,0); + pthread_detach(thr); + return 0; // stupid, but I don't want keep result returned by Fl::Run() +} +//----------------------------------------------------------------------------- + #if MGL_HAVE_QT==0 -HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *) +HMGL mgl_create_graph_qt(int (*)(HMGL gr, void *p), const char *, void *, void (*)(void *p)) { return NULL; } int mgl_qt_run(){return 0;} #endif @@ -177,20 +197,26 @@ int mgl_qt_run(){return 0;} uintptr_t mgl_create_graph_qt_(const char *title, int l) { char *s = new char[l+1]; memcpy(s,title,l); s[l]=0; - uintptr_t t = uintptr_t(mgl_create_graph_qt(0,s,0)); + uintptr_t t = uintptr_t(mgl_create_graph_qt(0,s,0,0)); delete []s; return t; } int mgl_qt_run_() { return mgl_qt_run(); } //----------------------------------------------------------------------------- +// +// mglDraw class handling +// +//----------------------------------------------------------------------------- int mgl_draw_class(mglBase *gr, void *p) { mglGraph g(gr); mglWindow *w = (mglWindow *)p; // so stupid way to save mglDraw class inheritance :( return (w && w->dr) ? w->dr->Draw(&g) : 0; } -//return p ? ((mglDraw *)p)->Draw(&g) : 0; } void mgl_reload_class(void *p) -{ if(p) ((mglDraw *)p)->Reload(); } +{ + mglWindow *w = (mglWindow *)p; // so stupid way to save mglDraw class inheritance :( + if(w && w->dr) w->dr->Reload(); +} //----------------------------------------------------------------------------- int mgl_draw_graph(mglBase *gr, void *p) {